﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace FlyShop
{
    public partial class FrmConsultaAeroporto : Form
    {
        // Indica o código do registro selecionado na grid
        int linhaSelecionadaGrid = -1;

        OleDbConnection conexao;
        OleDbCommand comando;
        OleDbDataAdapter da;
        DataSet ds;
        String strConexao = "Provider=MSDAORA.1;Data Source=localhost;Persist Security Info=True;User ID=pi;Password=pi";
        String sqlConsulta = "select a.cod_aeroporto, a.nome, c.nome, c.uf from aeroporto a inner join cidade c on a.cod_cidade = c.cod_cidade";
        String sqlExcluiRegistro = "delete from aeroporto where cod_aeroporto = ?";
        String sqlConsultaFiltro = "select a.cod_aeroporto, a.nome, c.nome, c.uf from aeroporto a inner join cidade c on a.cod_cidade = c.cod_cidade where a.nome like ? and c.nome like ? and c.uf like ?";
       


        public FrmConsultaAeroporto()
        {
            InitializeComponent();
        }

        private void FrmConsultaAeroporto_Load(object sender, EventArgs e)
        {
            conexao = new OleDbConnection(strConexao);
            conexao.Open();

            // Comando para configurar a sessão
            // Configura para o banco de dados ficar case-insensitive  
            OleDbCommand comandoAlteraSessao = new OleDbCommand("alter session set nls_sort=BINARY_CI", conexao);
            comandoAlteraSessao.ExecuteNonQuery();

            comandoAlteraSessao.CommandText = "alter session set nls_comp=LINGUISTIC";
            comandoAlteraSessao.ExecuteNonQuery();

            atualiza();
            formataGrid();
        }

        public void atualiza()
        {
            // Faz uma consulta por todos os registros
            da = new OleDbDataAdapter(sqlConsulta, conexao);
            ds = new DataSet();
            da.Fill(ds, "Aeroporto");
            dgvAeroporto.DataSource = ds.Tables["Aeroporto"];

            // Limpa a seleção e a variável de indicação do código
            dgvAeroporto.ClearSelection();
            linhaSelecionadaGrid = -1;

            // Limpa a label de mensagem e a imagem de alerta
            lblMensagem.Text = "";
            alertNotificacao.Hide();
        }

        private void formataGrid()
        {
            dgvAeroporto.Columns[0].Visible = false;
            dgvAeroporto.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvAeroporto.Columns[1].HeaderText = "Nome";
            dgvAeroporto.Columns[2].Width = 200;
            dgvAeroporto.Columns[2].HeaderText = "Cidade";
            dgvAeroporto.Columns[3].HeaderText = "UF";
            dgvAeroporto.ScrollBars = ScrollBars.Vertical;
            dgvAeroporto.RowHeadersVisible = false;
            dgvAeroporto.MultiSelect = false;
            dgvAeroporto.AllowUserToAddRows = false;
            dgvAeroporto.AllowUserToDeleteRows = false;
            dgvAeroporto.ReadOnly = true;
            dgvAeroporto.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvAeroporto.TabStop = false;
        }

        private void FrmConsultaAeroporto_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }

        private void dgvAeroporto_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                linhaSelecionadaGrid = e.RowIndex;
            }
            catch (Exception)
            {
                linhaSelecionadaGrid = -1;
            }
        }

        private void btnCadastrar_Click(object sender, EventArgs e)
        {
            FrmCadastroAeroporto frmCadastro = new FrmCadastroAeroporto();
            frmCadastro.Text = "Cadastro de aeroporto";
            frmCadastro.ShowDialog();
            atualiza();
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                FrmCadastroAeroporto frmEdicao = new FrmCadastroAeroporto();
                frmEdicao.Text = "Edição de aeroporto";
                frmEdicao.edicao = true;
                frmEdicao.codAeroporto =
                    Int32.Parse(dgvAeroporto.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                frmEdicao.ShowDialog();
                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {

                DialogResult drConfirmacao = MessageBox.Show(this, "Deseja excluir o registro selecionado?\nNão será possível excluir o registro caso ele tenha dependências.",
                  "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (drConfirmacao == DialogResult.Yes)
                {
                    comando = new OleDbCommand(sqlExcluiRegistro, conexao);

                    OleDbParameter pCod = new OleDbParameter("cod_aeroporto", OleDbType.Integer);
                    pCod.Value = Int32.Parse(dgvAeroporto.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                    comando.Parameters.Add(pCod);

                    // Caso o registro em questão tenha dependentes
                    // será lançada uma exceção
                    try
                    {
                        // Delete
                        comando.ExecuteNonQuery();
                        atualiza();
                    }
                    catch (OleDbException)
                    {
                        MessageBox.Show(this, "Não é possível excluir um registro com dependentes.",
                            "Operação inválida", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }

            }
            else
            {
                lblMensagem.Text = "Selecione um registro para excluir.";
                alertNotificacao.Show();
            } 
        }

        private void dgvAeroporto_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (linhaSelecionadaGrid != -1)
            {
                FrmCadastroAeroporto frmEdicao = new FrmCadastroAeroporto();
                frmEdicao.Text = "Edição de aeroporto";
                frmEdicao.edicao = true;
                frmEdicao.codAeroporto =
                    Int32.Parse(dgvAeroporto.Rows[linhaSelecionadaGrid].Cells[0].Value.ToString());
                frmEdicao.ShowDialog();
                atualiza();
            }
            else
            {
                lblMensagem.Text = "Selecione um registro para alterar.";
                alertNotificacao.Show();
            }
        }

        private void dgvAeroporto_Sorted(object sender, EventArgs e)
        {
            dgvAeroporto.ClearSelection();
            linhaSelecionadaGrid = -1;
        }

        private void filtro_TextChanged(object sender, EventArgs e)
        {
            comando = new OleDbCommand(sqlConsultaFiltro, conexao);

            OleDbParameter pFiltroNome = new OleDbParameter("nome", OleDbType.VarChar);
            pFiltroNome.Value = txtNome.Text.Trim() + "%";
            comando.Parameters.Add(pFiltroNome);

            OleDbParameter pFiltroCidade = new OleDbParameter("cidade", OleDbType.VarChar);
            pFiltroCidade.Value = txtCidade.Text.Trim() + "%";
            comando.Parameters.Add(pFiltroCidade);

            OleDbParameter pFiltroUF = new OleDbParameter("uf", OleDbType.VarChar);
            pFiltroUF.Value = txtUF.Text.Trim() + "%";
            comando.Parameters.Add(pFiltroUF);

            da = new OleDbDataAdapter(comando);

            ds.Clear();
            da.Fill(ds, "Aeroporto");

            dgvAeroporto.DataSource = ds.Tables["Aeroporto"];

            dgvAeroporto.ClearSelection();
            linhaSelecionadaGrid = -1;
        }

        private void dgvAeroporto_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            linhaSelecionadaGrid = e.RowIndex;
        }

        private void FrmConsultaAeroporto_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }

            //Hotkey para novo cadastro
            if (e.KeyData == (Keys.Control | Keys.N))
            {
                btnCadastrar_Click(sender, e);
            }
        }
    }
}
